/**
 * @file utils.h
 * @author BadFatCat0919 (543015378@qq.com)
 * @brief 常用工具
 */

#ifndef __UTILS_H__
#define __UTILS_H__

#include "def.h"
#include "log.h"
#include <cmath>

namespace utils {
    /**
     * @brief 秒数转帧数
     * @param second 秒数
     * @return int 帧数
     */
    inline int toFrames(double second) {
        return std::round(second * 50);
    }

    /**
     * @brief 帧数转秒数
     * @param frames 帧数
     * @return double 秒数
     */
    inline double toSecond(int frames) {
        return frames * 0.02;
    }

    /**
     * @brief 将角度转换到(-PI,PI)区间
     * @param angle 需要转换的角度
     * @return double 转换到(-PI,PI)区间后的角度
     */
    inline double angleConvert(double angle) {
        if(angle > PI) {
            angle = angle - 2*PI;
        } else if (angle < -PI) {
            angle = angle + 2*PI;
        }
        return angle;
    }

    /**
     * @brief 将数字映射为字符
     * @param num 需要映射的数字(0-9)
     * @return char 映射得到的字符
     */
    inline char numToChar(int num) {
        return num + '0';
    }

    /**
     * @brief 将字符映射为数字
     * @param c 需要映射的字符('0'-'9')
     * @return int 映射得到的数字
     */
    inline int charToNum(char c) {
        return c - '0';
    }

    /**
     * @brief 判断目标点是否落在方形区域内
     * @param x 目标点横坐标
     * @param y 目标点纵坐标
     * @param centerX 方形区域中心点横坐标
     * @param centerY 方形区域中心点纵坐标
     * @param range 方形区域半径
     * @return true 在区域内
     * @return false 不在区域内
     */
    inline bool isInRectRange(int x, int y, int centerX, int centerY, int range) {
        if(std::abs(x - centerX) <= range && std::abs(y - centerY) <= range) {
            return true;
        }
        return false;
    }

    /**
     * @brief 求最大值
     * @param a 数值a
     * @param b 数值b
     * @return int a与b二者较大值
     */
    inline int max(int a, int b) {
        return a > b ? a : b;
    }
}

#endif // __UTILS_H__
